package com.ztr.conversion.word2pdf;

import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;

/**
 * <p>
 * word 转 pdf 工具类
 * </p>
 */
@Slf4j
public class Word2PdfUtil {

    /**
     * 将Word文档字节流转换为PDF字节流。
     *
     * 此方法接收一个Word文档的字节流，使用Aspose Words库将该文档转换为PDF格式，
     * 并返回转换后的PDF文档的字节流。这种方法允许在不进行文件IO操作的情况下，
     * 直接在内存中进行文档格式的转换，适用于需要在应用程序中动态生成或处理PDF文档的场景。
     *
     * @param wordBytes Word文档的字节流。
     * @return 转换后的PDF文档的字节流。
     * @throws Exception 如果转换过程中发生错误，将抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static byte[] wordBytes2PdfBytes(byte[] wordBytes) {
        // 使用字节输入流包裹Word文档的字节流，以创建Document对象
        Document document = new Document(new ByteArrayInputStream(wordBytes));
        // 创建一个字节输出流，用于存储转换后的PDF文档
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        // 将文档保存为PDF格式，输出到字节输出流中
        document.save(outputStream, SaveFormat.PDF);
        // 返回字节输出流中的字节数组，即转换后的PDF文档的字节流
        // 返回生成的`pdf`字节码
        return outputStream.toByteArray();
    }


    /**
     * 将Word文档字节流转换为PDF文件。
     * 此方法接收Word文档的字节流和目标PDF文件路径，通过Aspose Words库将Word文档转换为PDF格式，并保存到指定路径。
     *
     * @param wordBytes Word文档的字节流形式。
     * @param pdfFilePath 目标PDF文件的路径。
     * @return 返回表示转换后PDF文件的File对象。
     * @throws Exception 如果转换过程中发生错误，将抛出异常。
     */
    @SneakyThrows(Exception.class)
    public static File wordBytes2PdfFile(byte[] wordBytes, String pdfFilePath) {
        // 使用字节流初始化Document对象，准备进行转换
        Document document = new Document(new ByteArrayInputStream(wordBytes));
        // 将Document对象保存为PDF格式，目标路径为pdfFilePath
        document.save(pdfFilePath, SaveFormat.PDF);
        // 返回转换后的PDF文件的File对象
        return new File(pdfFilePath);
    }

}
